package com.clp.protocol.iec104.client.pipeline.handler;

import com.clp.protocol.iec104.apdu.Apdu;
import com.clp.protocol.iec104.client.Master;
import com.clp.protocol.iec104.client.pipeline.DuplexMasterHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class UTypeMasterHandler extends DuplexMasterHandler {
    public UTypeMasterHandler(Master master) {
        super(master);
    }

    @Override
    public void whenActive(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void whenRecvingApdu(ChannelHandlerContext ctx, Apdu apdu) {
        if (apdu.isUType()) { // 如果是U帧，则处理消息
            switch (apdu.castToUType().getUApci().getCtrlArea().getUCtrlType()) {
                case U_START_DT_V:
                    log.debug("U: 收到启动传输激活\n{}", apdu);
                case U_START_DT_C: // 启动确认的U格式
                    log.debug("U: 收到启动传输确认\n{}", apdu);
                    break;
                case U_STOP_DT_V:
                    log.debug("U: 收到停止传输激活\n{}", apdu);
                case U_STOP_DT_C: // 停止传输确认
                    log.debug("U: 收到停止传输确认\n{}", apdu);
                case U_TEST_FR_V: // 链路测试激活
                    log.debug("U: 收到链路测试激活\n{}", apdu);
                    break;
                case U_TEST_FR_C: // 链路测试确认
                    log.debug("U: 收到链路测试确认\n{}", apdu);
                    break;
            }
        }
        passRecvingApdu(ctx, apdu);
    }

    @Override
    public void whenSendingApdu(ChannelHandlerContext ctx, Apdu apdu, ChannelPromise promise) {
        if (apdu.isUType()) { // 如果是U帧，则处理消息
            switch (apdu.castToUType().getUApci().getCtrlArea().getUCtrlType()) {
                case U_START_DT_V:
                    log.debug("U: 发送启动传输激活\n{}", apdu);
                case U_START_DT_C: // 启动确认的U格式
                    log.debug("U: 发送启动传输确认\n{}", apdu);
                    break;
                case U_STOP_DT_V:
                    log.debug("U: 发送停止传输激活\n{}", apdu);
                case U_STOP_DT_C: // 停止传输确认
                    log.debug("U: 发送停止传输确认\n{}", apdu);
                case U_TEST_FR_V: // 链路测试激活
                    log.debug("U: 发送链路测试激活\n{}", apdu);
                    break;
                case U_TEST_FR_C: // 链路测试确认
                    log.debug("U: 发送链路测试确认\n{}", apdu);
                    break;
            }
        }
        passSendingApdu(ctx, apdu, promise);
    }

    @Override
    public void whenInActive(ChannelHandlerContext ctx) throws Exception {

    }

    @Override
    public void whenExceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

    }
}
